分享回顾 | Jina AI x 国际开源节:从神经搜索到多模态应用
文章导读
本文为 Jina AI 联合创始人兼 CTO 王楠,在 2022 年 11 月 6 日国际开源节机器学习峰会的分享实录。阅读本文,你将对神经搜索、多模态技术以及 Jina AI 有较为全面的了解。
神经搜索听起来很抽象,这里举几个实际的使用场景,给大家一个更为直观的印象,典型的神经搜索系统其实就是大家每天都在运用的以图搜图;另一个就是在双十一期间,各大电商平台广泛应用到客服机器人;还有一个就是文字搜索图片。
神经搜索实际应用场景
简单来说,神经搜索就是基于深度学习和人工神经网络的信息检索技术,非常适合去处理非结构化的多模态数据,其实神经搜索就是一个典型的多模态应用。
多模态数据和应用
多模态是指数据中的信息,包含各种不同的模态,这里的模态指的是数据的表现形式,比如图片、声音和视频等。
这里有一个典型的多模态例子。比如我们每天看到的文章,它的内容不仅仅包含文字,也有图片、视频等等;类似的还有电商中,我们看到的商品包含视频、音乐等信息,这些其实都是典型的多模态数据。
多模态数据
随着多模态研究的不断深入,我们可以将不同模态的信息进行融合,诞生出来了AI作画、数字人技术这些应用,其实它们的核心作用就是多模态的技术。包括 Open AI,他们在 DALL·E, CLIP 上的研究,以及百度在 ERNIE-ViLG 上面的研究,都是朝着多模态方向发展的。
多模态相关的研究和应用
多模态在实际生产中的应用越来越广泛,但是在实际落地的过程中,大家会发现,从 0 到 1 搭建起一套这么大的应用并投入生产环境是非常复杂的,大家遇到的第一个问题就是:怎样高效地表示多模态的数据?
如何表示多模态数据?
继续引用之前提到的关于新闻的这个例子,我们如何在毫无损失信息的前提下去包装这个新闻,会面对两个比较关键的挑战。
第一个挑战在于,这个新闻里面包含不同模态的信息,我们的数据结构就必须能够高效地去执行,这里我们比较简单地解决,就是只存了一个图片的URL。
表示多模态数据的挑战
第二个挑战在于,这个数据很大,它有典型的嵌套结构,这里的嵌套结构就是我们这个文章,它不仅有章节的信息还有段落的信息,每个段落中又包含很多句子,每个句子的信息我们又都需要,对应的结构里需要表达其中的关键信息,对此,我们在这里使用 CLIP 模型来计算。
操作多模态数据的挑战
这个时候我们需要先把代码从网上下载下来,存在一个临时的文件夹里,再下载图片,同时去计算这个向量的表示,计算完了之后再把向量的表示存储起来,这个过程是需要我们自己去解决的,在做神经搜索和多模态应用的过程中也会反复遇到这样的问题,Jina AI 就能提供解决方案,关于解决方案,实际上就是去设计 Document 来对多模态数据进行封装,同时把它包含并发布在 Docarray 的 Python 包里,可以提供给整个社区的小伙伴去使用,下面来讲一下怎么用 Document 来表示多模态数据。
DocArray:封装一切非结构化数据
用 Document 表示多模态数据的使用方法和之前使用 Passenger 没有太大的区别,唯一的变化只有两点:
一是使用 DocArray 提供的 dataclass;二是使用了 Docarray 提供的数据类型之后,可以和不同类型的数据进行替换,实现 Document 来封装整个数据。
使用 Document 表示多模态数据
这样做的效果主要有两个,第一,Document 对各种模态的数据有更好的支持,比如图片就不需要我们再去考虑加载和下载的问题,因为它会自动地帮你去加载;第二,对嵌套结构的支持,比如在这里我们只用简单地表示:它有两个不同的段落,使用 Document 就可以很方便地表示这个嵌套结构,它也支持向量表示。除此之外,它还提供各种模态的基本操作,有预览功能,还可以支持不同深度学习的框架。如果要大量地处理数据,可以直接使用 Docarray,它支持slicing,同时支持条件的查询。
DocumentArray 提供 Document 的批量处理接口
有兴趣的小伙伴可以去关注一下,下面是 Docarray 的地址:
https://github.com/docarray/docarray
如何将多模态服务应用推向生产环境?
除了封装数据之外,如果想要搭建一个多模态应用,并推进生产环境,这里还会面临其他的挑战。最大的挑战就是,在多模态应用里面,我们会普遍的使用到多个网络模型,不同的模型在开发过程中又会有完全不同的开发环境,所以容器化的要求就是第一个挑战;第二,上下游会对接口有要求,都需要开发者自己去实现。第三;不同的模型有不同的算力要求,这个时候需要对整个系统进行一个分布式的部署,怎样实行分布式部署并保证网络通信的高效性,是开发者在开发多模态应用过程需要考虑的问题;最后,怎样在云原生的环境去做部署也是常见的问题之一。
针对上述问题,我们开发了相关的工具,最终目的就是想对整个的搭建过程进行一个抽象的总结,从而帮助开发者节省开发时间,避免重复。
只需 Import Jina
如下图所示,这是一个典型的 Jina 的流程示意图,在这里,我们在设计的时候就考虑到了分布式计算和容器化的要求,所以将整个系统抽象成了多个微服务构成的一个新型网络,在这个系统里进行封装,我们把整个系统封装成了一个 Flow,它负责和不同的模块进行通讯,每个模块又封装成了一个 Excuter,这些 Executor 之间是通过网络进行通讯,它们彼此是完全独立的,这样可以帮助大家更加专心的去开发业务。
多模态应用服务的搭建
下面看一下用 Jina 去实现我们之前提到的文章的向量计算。如果需要做改动,其实就是用这个自己写一个继承 Executor 类,Jina 提供 Executor 的积累,进行一个封装,同时,Jina 也提供 request 修饰器,对核心函数进行标注,通过这两个操作,Jina 就可以为这个模块添加必要的接口,保证它可以和符号进行整合。
开箱即用的应用服务
在定义好自己的 Executor 之后,只需要在这里用 Flow,把多个 Executor 串联起来,示例里是有两个 Executor,一个是对图片进行向量计算,另一个则是对文字进行向量计算。只要通过这样简单的配置,就可以直接让整个 Gateway 负责对外提供不同的 API 服务,包括:HTTP、Websocket、gRPC 和 GraphQL。
原生支持不同的网络接口
同时 Jina 会自动生成 Open API 的文档,采用配置和代码相分离的设计,大家可以使用 YAML 文件对整个系统进行配置。
提供Open API
一键实现服务伸缩
如果不想用这样的编排,也可以直接导出 Kubernetes、Docker compose 这样的配置。
支持云原生部署
Jina AI 开源地址
Jina:get.jina.ai
DocArray:github.com/docarray/docarray
CLIP-as-service:github.com/jina-ai/clip-as-service
Finetuner:github.com/jina-ai/finetuner
Jina NOW:github.com/jina-ai/now
JCloud:github.com/jina-ai/jcloud
Jina AI 社区反馈征集